package br.ufrj.dcc.ad.event;

import java.util.List;

import br.ufrj.dcc.ad.systems.Cliente;
import br.ufrj.dcc.ad.systems.Servidor;

public abstract class Event implements Comparable<Event>{
	/** Cliente gerador do evento. */
	protected Cliente gerador;
	protected Servidor servidor;
	protected double tempoOcorrencia;
	
	public Event(Cliente gerador,Servidor servidor, double tempoOcorrencia) {
		this.gerador = gerador;
		this.servidor = servidor;
		this.tempoOcorrencia = tempoOcorrencia;
	}
	
	/**
	 * Executa a ação do evento.
	 * @return A lista de eventos de ivocação gerados por este evento.
	 */
	public abstract List<Event> executaAcao();
	
	/**
	 * Eventos com menor tempo de ocorrência devem ser atendidos primeiro.
	 * Eventos de consumo devem ficar no fim, pois são os únicos que podem deslocar o tempo 
	 * e este não deve ser deslocado até que todos os eventos desse tempo sejam atendidos.
	 */
	@Override
	public int compareTo(Event eventoAComparar) {
		if(this.tempoOcorrencia > eventoAComparar.tempoOcorrencia){
			return 1;
		}
		if(this.tempoOcorrencia < eventoAComparar.tempoOcorrencia){
			return -1;
		}
		return ((this instanceof ServerAtendmentEvent && !(eventoAComparar instanceof ServerAtendmentEvent))?1:0);
		
	}
	
	/**
	 * Retorna uma String representativa do evento para debug. 
	 * @param antes O que deve vir antes dos dados do evento.
	 * @param depois O que deve vir depois dos dados do evento.
	 * @return Uma String representativa do evento para debug.
	 */
	public String toDebugString(String antes,String depois){
		return antes + 
			   this.getClass() + " - " +
			   this.getGerador().getNome() + " - " +
			   this.getGerador().getTipoCliente() + " - " +
			   this.getTempoOcorrencia() + " - " +
			   depois;
	}
	
	public Cliente getGerador() {
		return gerador;
	}
	public double getTempoOcorrencia() {
		return tempoOcorrencia;
	}
}
